//
// Created by lanlu on 2025/8/11.
//

#include <climits>
using namespace std;

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;

    TreeNode() : val(0), left(nullptr), right(nullptr){}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr){}
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right){}
};

class Solution {
public:
    // 在递归函数外声明变量时 递归处理的是同一个变量
    int minDiff;
    int prev;
    // 使用递归的中序遍历 不记录结果 只记录前一个节点的值 然后计算节点之间的最小差
    void inorder(TreeNode *root)
    {
        if (root == nullptr) return;
        inorder(root->left);
        // 对于二叉搜索树 中序遍历的结果是递增的 当前节点的值 > 前一个节点的值
        if (prev != -1)
        {
            int diff = root->val - prev;
            if (diff < minDiff)
            {
                minDiff = diff;
            }
        }
        // 更新前一个节点的值
        prev = root->val;
        inorder(root->right);
    }

    int minDiffInBST(TreeNode* root) {
        // 所有节点的值 大于等于0
        prev = -1;
        minDiff = INT_MAX;
        inorder(root);
        return minDiff;
    }
};